﻿#ifndef XMLMANAGER_H
#define XMLMANAGER_H

#include <QObject>
#include <QtXml/QDomDocument>
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QList>
#include <QMap>

#include "SINGLETON_MACRO.h"

class XmlManager
{
    DECLARE_SINGLETON(XmlManager)
public:
    // 文件操作
    bool loadXmlFile(const QString &filePath);
    bool saveXmlFile(const QString &filePath = QString());
    QString currentFilePath() const;

    // DOM 方式操作
    bool addElement(const QString &parentPath, const QString &tagName,
                    const QMap<QString, QString> &attributes = QMap<QString, QString>(),
                    const QString &text = QString());
    bool updateElement(const QString &elementPath,
                       const QMap<QString, QString> &attributes = QMap<QString, QString>(),
                       const QString &text = QString());
    bool removeElement(const QString &elementPath);
    QDomElement getElement(const QString &elementPath) const;
    QString getElementText(const QString &elementPath) const;
    QMap<QString, QString> getElementAttributes(const QString &elementPath) const;
    QList<QDomElement> getChildElements(const QString &parentPath) const;
    QDomNodeList getElementsByTagName(const QString& tagName);

    // 流方式操作
    bool readXmlWithStream(const QString &filePath, QList<QMap<QString, QString>> &data);
    bool writeXmlWithStream(const QString &filePath, const QList<QMap<QString, QString>> &data);

    QDomElement getRootElement() const;

private:
    QDomDocument m_domDoc;
    QString m_currentFilePath;

    // DOM 辅助方法
    QDomElement findElementByPath(const QString &path) const;
    QStringList splitPath(const QString &path) const;
    QDomElement createElementWithAttributes(const QString &tagName,
                                            const QMap<QString, QString> &attributes);
};

#endif // XMLMANAGER_H
